package com.zxl.designpattern.behavioral.observer; /**
 * 天气数据类
 * 实现了Subject接口，作为主题（被观察对象）
 */
import java.util.ArrayList;
import java.util.List;

public class WeatherData implements Subject {
    private final List<Observer> observers;  // 观察者列表
    private double temperature;        // 温度
    private double humidity;           // 湿度
    private double pressure;           // 气压
    
    /**
     * 构造函数，初始化观察者列表
     */
    public WeatherData() {
        observers = new ArrayList<>();
    }
    
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
        System.out.println("注册了新的观察者: " + observer.getClass().getSimpleName());
    }
    
    @Override
    public void removeObserver(Observer observer) {
        if (observers.remove(observer)) {
            System.out.println("移除了观察者: " + observer.getClass().getSimpleName());
        } else {
            System.out.println("未找到观察者: " + observer.getClass().getSimpleName());
        }
    }
    
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature, humidity, pressure);
        }
    }
    
    /**
     * 当天气数据变化时调用此方法
     * @param temperature 温度
     * @param humidity 湿度
     * @param pressure 气压
     */
    public void setMeasurements(double temperature, double humidity, double pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
    
    /**
     * 通知观察者数据已变化
     */
    private void measurementsChanged() {
        notifyObservers();
    }

}    